export function sub(v1, v2, out) {
    if (out) {
        out[0] = v1[0] - v2[0];
        out[1] = v1[1] - v2[1];
        return out;
    } else {
        return [v1[0] - v2[0], v1[1] - v2[1]];
    }
}

export function add(v1, v2, out) {
    if (out) {
        out[0] = v1[0] + v2[0];
        out[1] = v1[1] + v2[1];
        return out;
    } else {
        return [v1[0] + v2[0], v1[1] + v2[1]];
    }
}

export function dot(v1, v2, out) {
    if (out) {
        out[0] = v1[0] * v2[0];
        out[1] = v1[1] * v2[1];
        return out;
    } else {
        return [v1[0] * v2[0], v1[1] * v2[1]];
    }
}

export function scale(v, n, out) {
    if (out) {
        out[0] = v[0] * n;
        out[1] = v[1] * n;
        return out;
    } else {
        return [v[0] * n, v[1] * n];
    }
}

export function isZero(v) {
    return v[0] === 0 && v[1] === 0;
}

export function normalize(v, out) {
    const l = length(v);
    if (out) {
        if (!l) {
            out = [0, 0];
        } else {
            scale(v, 1 / l, out)
        }
        return out;
    } else {
        if (!l) {
            return [0, 0];
        }
        return scale(v, 1 / l);
    }
}

export function length(v) {
    return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
}


export function angle(vec) {
    const x = vec[0], y = vec[1];
    if (x == 0) {
        if (y > 0) {
            return Math.PI / 2;
        } else if (y < 0) {
            return Math.PI * (3 / 2);
        } else {
            return 0;
        }

    } else {
        if (x > 0) {
            return Math.atan(y / x);
        } else {
            return Math.atan(y / x) + Math.PI;
        }
    }
}